Purpose

The purpose of this assessment is to identify areas of potentially increased mental health need as a result of COVID-19 in NYC. The resulting aim is to route public health efforts and mental health resources to those identified areas of highest need.

Background of Datasets

For this assessment, we will use the CDC’s Social Vulnerability Index along with the child opportunity index to establish the baseline mental health need in NYC. COVID19 related data will then be added onto this baseline as a “COVID19 Layer” to identify those areas of increased mental health need in the context of COVID19

Social Vulnerability Index (SVI)

  • Background: In the context of the global COVID-19 pandemic, “SVI data can be used to identify communities that will need continued support to recover following an emergency or natural disaster, and allocate emergency preparedness funding by community need.” As seen in current events, COVID19 disproportionately affects Black and Hispanic communities. It is evident that public health institutions not only factor in, but lead with the social determinants of health – which contribute to racial inequities in health– when planning and executing emergency resource allocation during and after COVID19.

Exploration of Social Vulnerability Index (SVI)

Using FIPS code '36' for state 'NY'

SVI consists of 15 census variables organized into 4 different themes: Socioeconomic Status (RPL_THEME1), Household Composition & Disability (RPL_THEME2), Minority Status & Language (RPL_THEME3), Housing & Transportation (RPL_THEME4) and an overall summary (RPL_THEMES). These themes are measured in percentile rank. A higher percentile rank represents greater vulnerability, with a percentile rank of 0.00 meaning the least vulnerable and 1.00 meaning the most vulnerable. Reference:https://svi.cdc.gov/Documents/Data/2016_SVI_Data/SVI2016Documentation.pdf

These rankings have been alloted by census tract (GEOID)– “uniquely numbered subdivisions of a county, representing a neighborhood averaging about 4,000 inhabitants.” NYC has 5 different counties (“New York”, “Kings”, “Bronx”, “Richmond”, “Queens”) which have been subdivided into 2,166 census tracts. To provide a frame of reference, census tracts are more granular than zip codes. There are 178 zip codes in NYC.

To begin, we will review SVI data by NY county.

Review of SVI Data by NYC County
COUNTY FIPS LOCATION RPL_THEME1 RPL_THEME2 RPL_THEME3 RPL_THEME4 RPL_THEMES
Richmond 36085 Richmond County, New York 0.2951 0.1967 0.8852 0.7049 0.5410
New York 36061 New York County, New York 0.5738 0.0164 0.9508 0.9672 0.6393
Queens 36081 Queens County, New York 0.7049 0.0328 0.9836 0.7213 0.7377
Kings 36047 Kings County, New York 0.9016 0.3770 0.9672 0.8525 0.9180
Bronx 36005 Bronx County, New York 1.0000 0.8033 1.0000 0.9508 1.0000

At a glance, the Bronx county has the highest overall social vulnerability (RPL_THEMES=1.000) followed by Kings county (RPL_THEMES=0.918). This seems to indicate that these two counties are likely to be substantially impacted by COVID19 and need priority allocation of emergency resources.

Mapping SVI data by County
Using FIPS code '36' for state 'NY'

Now, let’s take a look at how COVID19 has impacted NYC counties to date:

BOROUGH_GROUP COVID_CASE_COUNT COVID_CASE_RATE COUNTY
The Bronx 35860 2436.99 Bronx
Brooklyn 41744 1538.61 Kings
Manhattan 19672 1045.07 New York
Queens 48847 1950.99 Queens
Staten Island 11520 2293.18 Richmond
Citywide 157713 NA NA

The above contains cumulative, age adjusted rates of confirmed cases per 100,000 people, by NYC borough of residence. We can see that The Bronx (Bronx County) and Staten Island (Richmond County) have higher COVID case rates in relation to all other counties. Assuming COVID case rate is an indicator of COVID impact, let’s add in COVID data into the current SVI rankings.

Note: I don’t think it’s this easy.

Adding COVID DATA into Percent Ranking in SVI
COUNTY BOROUGH_GROUP SPL_THEMES COVID_CASE_RATE covid_rank adj_SPL svi_covid_rank
Richmond Staten Island 7.4917 2293.18 0.75 8.2417 0.25
New York Manhattan 7.8524 1045.07 0.00 7.8524 0.00
Queens Queens 8.1966 1950.99 0.50 8.6966 0.50
Kings Brooklyn 9.9672 1538.61 0.25 10.2172 0.75
Bronx The Bronx 11.8525 2436.99 1.00 12.8525 1.00

Based on the new “svi_covid_rank”, we can see that Bronx and Kings county still hold their rank as the highest in social vulnerability in the context of COVID.

Mapping COVID adjusted SVI data by County

ZIP CODE CLEAN/TRANSFORM #178 zip codes in nyc

Leaflet#1 - SVI by Census Tract

Leaflet#2 - NYC ZIPS

Leaflet#3 - NYC ZIPS + COVID19 % Positive

Some values were outside the color scale and will be treated as NASome values were outside the color scale and will be treated as NA

Leaflet#4 - NYC CHILD OPP

Leaflet#5 - SVI by Census Tract + ZCTAS (ZIP) Overlay

LS0tDQp0aXRsZTogIkFzc2Vzc21lbnQgb2YgTWVudGFsIEhlYWx0aCBOZWVkIEJlZm9yZSwgRHVyaW5nLCBhbmQgQWZ0ZXIgQ09WSUQtMTkiDQphdXRob3I6ICJKZW5zZW4gSHUiDQphbHdheXNfYWxsb3dfaHRtbDogeWVzDQpvdXRwdXQ6DQogIHBkZl9kb2N1bWVudDoNCiAga2VlcF90ZXg6IHllcw0KLS0tDQojIyBQdXJwb3NlDQpUaGUgcHVycG9zZSBvZiB0aGlzIGFzc2Vzc21lbnQgaXMgdG8gaWRlbnRpZnkgYXJlYXMgb2YgcG90ZW50aWFsbHkgaW5jcmVhc2VkIG1lbnRhbCBoZWFsdGggbmVlZCBhcyBhIHJlc3VsdCBvZiBDT1ZJRC0xOSBpbiBOWUMuIFRoZSByZXN1bHRpbmcgYWltIGlzIHRvIHJvdXRlIHB1YmxpYyBoZWFsdGggZWZmb3J0cyBhbmQgbWVudGFsIGhlYWx0aCByZXNvdXJjZXMgdG8gdGhvc2UgaWRlbnRpZmllZCBhcmVhcyBvZiBoaWdoZXN0IG5lZWQuDQoNCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBlcnJvcj1UUlVFKQ0KDQpsaWJyYXJ5KHdlYnNob3QpDQpsaWJyYXJ5KGxlYWZsZXQpDQpsaWJyYXJ5KHJlYWRyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeSh0aWdyaXMpDQpsaWJyYXJ5KHNwKQ0KbGlicmFyeShodG1sd2lkZ2V0cykNCg0KI3JlYWQgZGF0YSANCmRzX3N2aTwtcmVhZF9jc3YoIi4uL1Jhd0RhdGEvU29jaWFsIFZ1bG5lcmFiaWxpdHkuY3N2IiwgY29sX3R5cGVzPWNvbHMoIkZJUFMiPWNvbF9jaGFyYWN0ZXIoKSkpDQojZmlwdG96aXA8LXJlYWQuZGVsaW0oIi4uL1Jhd0RhdGEvWklQX1RSQUNUXzAzMjAyMC50eHQiLCBjb2xDbGFzc2VzID0gYygiY2hhcmFjdGVyIiwiY2hhcmFjdGVyIiwiY2hhcmFjdGVyIiwiY2hhcmFjdGVyIiwiY2hhcmFjdGVyIiwiY2hhcmFjdGVyIikpDQpjb3VudHlfc3ZpPC1yZWFkX2NzdigiLi4vUmF3RGF0YS9zdmlfbnlfY291bnR5LmNzdiIsIGNvbF90eXBlcz1jb2xzKCJGSVBTIj1jb2xfY2hhcmFjdGVyKCkpKQ0KbnljX3ppcHM8LXJlYWRfY3N2KCIuLi9SYXdEYXRhL255Y196aXBzLmNzdiIpDQpjaGlsZF9vcHA8LXJlYWRfY3N2KCIuLi9SYXdEYXRhL255X2NoaWxkX29wcC5jc3YiKQ0KY292aWQ8LXJlYWRfY3N2KCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbnljaGVhbHRoL2Nvcm9uYXZpcnVzLWRhdGEvbWFzdGVyL3Rlc3RzLWJ5LXpjdGEuY3N2IikNCg0KYGBgDQojIyBCYWNrZ3JvdW5kIG9mIERhdGFzZXRzDQoqKkZvciB0aGlzIGFzc2Vzc21lbnQsIHdlIHdpbGwgdXNlIHRoZSBDREMncyBTb2NpYWwgVnVsbmVyYWJpbGl0eSBJbmRleCBhbG9uZyB3aXRoIHRoZSBjaGlsZCBvcHBvcnR1bml0eSBpbmRleCB0byBlc3RhYmxpc2ggdGhlIGJhc2VsaW5lIG1lbnRhbCBoZWFsdGggbmVlZCBpbiBOWUMuIENPVklEMTkgcmVsYXRlZCBkYXRhIHdpbGwgdGhlbiBiZSBhZGRlZCBvbnRvIHRoaXMgYmFzZWxpbmUgYXMgYSAiQ09WSUQxOSBMYXllciIgdG8gaWRlbnRpZnkgdGhvc2UgYXJlYXMgb2YgaW5jcmVhc2VkIG1lbnRhbCBoZWFsdGggbmVlZCBpbiB0aGUgY29udGV4dCBvZiBDT1ZJRDE5KioNCg0KIyMjIyAqKlNvY2lhbCBWdWxuZXJhYmlsaXR5IEluZGV4IChTVkkpKiogICANCg0KKiAgKipCYWNrZ3JvdW5kKio6IEluIHRoZSBjb250ZXh0IG9mIHRoZSBnbG9iYWwgQ09WSUQtMTkgcGFuZGVtaWMsICJTVkkgZGF0YSBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSBjb21tdW5pdGllcyB0aGF0IHdpbGwgbmVlZCBjb250aW51ZWQgc3VwcG9ydCB0byByZWNvdmVyIGZvbGxvd2luZyBhbiBlbWVyZ2VuY3kgb3IgbmF0dXJhbCBkaXNhc3RlciwgYW5kIGFsbG9jYXRlIGVtZXJnZW5jeSBwcmVwYXJlZG5lc3MgZnVuZGluZyBieSBjb21tdW5pdHkgbmVlZC4iIEFzIHNlZW4gaW4gY3VycmVudCBldmVudHMsIENPVklEMTkgZGlzcHJvcG9ydGlvbmF0ZWx5IGFmZmVjdHMgQmxhY2sgYW5kIEhpc3BhbmljIGNvbW11bml0aWVzLiBJdCBpcyBldmlkZW50IHRoYXQgcHVibGljIGhlYWx0aCBpbnN0aXR1dGlvbnMgbm90IG9ubHkgZmFjdG9yIGluLCBidXQgbGVhZCB3aXRoIHRoZSBzb2NpYWwgZGV0ZXJtaW5hbnRzIG9mIGhlYWx0aCAtLSB3aGljaCBjb250cmlidXRlIHRvIHJhY2lhbCBpbmVxdWl0aWVzIGluIGhlYWx0aC0tIHdoZW4gcGxhbm5pbmcgYW5kIGV4ZWN1dGluZyBlbWVyZ2VuY3kgcmVzb3VyY2UgYWxsb2NhdGlvbiBkdXJpbmcgYW5kIGFmdGVyIENPVklEMTkuICANCg0KIyMjIyAqKkV4cGxvcmF0aW9uIG9mIFNvY2lhbCBWdWxuZXJhYmlsaXR5IEluZGV4IChTVkkpKioNCg0KYGBge3IsIGNhY2hlPVRSVUUsIGVjaG89RkFMU0V9DQojI1NWSSBEQVRBIENMRUFOL1RSQU5TRk9STQ0KI3NlbGVjdCBzdmkgdmFyaWFibGVzDQpjb2xfc3ZpPC1jKCJTVENOVFkiLCJDT1VOVFkiLCJGSVBTIiwiUlBMX1RIRU1FMSIsIlJQTF9USEVNRTIiLCJSUExfVEhFTUUzIiwiUlBMX1RIRU1FNCIsIlJQTF9USEVNRVMiKQ0KZHNfc3ZpPC1kc19zdmlbY29sX3N2aV0NCiNicmluZyBpbiBzcGF0aWFsIGRhdGEgb24gIE5ZIHcvVGlncmlzIA0Kb3B0aW9ucyh0aWdyaXNfdXNlX2NhY2hlID0gVFJVRSkNCnRyYWN0cyA8LSB0cmFjdHMoc3RhdGUgPSAnTlknLCBjYj1UUlVFKQ0KDQojbWVyZ2Ugc3ZpIGFuZCBzcGF0aWFsIG55IGRhdGEgdG8gY3JlYXRlIGEgZW5yaWNoZWQgc3BhdGlhbCBkYXRhc2V0DQpjb2xuYW1lcyhkc19zdmkpWzNdPC0iR0VPSUQiDQpkc19tZXJnZWQ8LWdlb19qb2luKHRyYWN0cywgZHNfc3ZpLCAiR0VPSUQiLCAiR0VPSUQiKQ0KDQojTllDIGNvdW50aWVzIG9ubHkNCmNvdW50aWVzX255YzwtYygiTmV3IFlvcmsiLCAiS2luZ3MiLCAiQnJvbngiLCAiUmljaG1vbmQiLCAiUXVlZW5zIikNCmRzX21lcmdlZDwtZHNfbWVyZ2VkW2RzX21lcmdlZEBkYXRhJENPVU5UWSAlaW4lIGNvdW50aWVzX255YyxdDQp4PC1jKDUsMTEsMTM6MTcpDQoNCiNrbml0cjo6a2FibGUoZHNfbWVyZ2VkWzE6NSx4XSwgZm9ybWF0PSJtYXJrZG93biIpDQpgYGANCg0KU1ZJIGNvbnNpc3RzIG9mIDE1IGNlbnN1cyB2YXJpYWJsZXMgb3JnYW5pemVkIGludG8gNCBkaWZmZXJlbnQgdGhlbWVzOiBTb2Npb2Vjb25vbWljIFN0YXR1cyAoUlBMX1RIRU1FMSksIEhvdXNlaG9sZCBDb21wb3NpdGlvbiAmIERpc2FiaWxpdHkgKFJQTF9USEVNRTIpLCBNaW5vcml0eSBTdGF0dXMgJiBMYW5ndWFnZSAoUlBMX1RIRU1FMyksIEhvdXNpbmcgJiBUcmFuc3BvcnRhdGlvbiAoUlBMX1RIRU1FNCkgYW5kIGFuIG92ZXJhbGwgc3VtbWFyeSAoUlBMX1RIRU1FUykuIFRoZXNlIHRoZW1lcyBhcmUgbWVhc3VyZWQgaW4gcGVyY2VudGlsZSByYW5rLiBBIGhpZ2hlciBwZXJjZW50aWxlIHJhbmsgcmVwcmVzZW50cyBncmVhdGVyIHZ1bG5lcmFiaWxpdHksIHdpdGggYSBwZXJjZW50aWxlIHJhbmsgb2YgMC4wMCBtZWFuaW5nIHRoZSBsZWFzdCB2dWxuZXJhYmxlIGFuZCAxLjAwIG1lYW5pbmcgdGhlIG1vc3QgdnVsbmVyYWJsZS4gUmVmZXJlbmNlOmh0dHBzOi8vc3ZpLmNkYy5nb3YvRG9jdW1lbnRzL0RhdGEvMjAxNl9TVklfRGF0YS9TVkkyMDE2RG9jdW1lbnRhdGlvbi5wZGYgDQoNClRoZXNlIHJhbmtpbmdzIGhhdmUgYmVlbiBhbGxvdGVkIGJ5IGNlbnN1cyB0cmFjdCAoR0VPSUQpLS0gInVuaXF1ZWx5IG51bWJlcmVkIHN1YmRpdmlzaW9ucyBvZiBhIGNvdW50eSwgcmVwcmVzZW50aW5nIGEgbmVpZ2hib3Job29kIGF2ZXJhZ2luZyBhYm91dCA0LDAwMCBpbmhhYml0YW50cy4iIE5ZQyBoYXMgNSBkaWZmZXJlbnQgY291bnRpZXMgKCJOZXcgWW9yayIsICJLaW5ncyIsICJCcm9ueCIsICJSaWNobW9uZCIsICJRdWVlbnMiKSB3aGljaCBoYXZlIGJlZW4gc3ViZGl2aWRlZCBpbnRvIDIsMTY2IGNlbnN1cyB0cmFjdHMuIFRvIHByb3ZpZGUgYSBmcmFtZSBvZiByZWZlcmVuY2UsIGNlbnN1cyB0cmFjdHMgYXJlIG1vcmUgZ3JhbnVsYXIgdGhhbiB6aXAgY29kZXMuIFRoZXJlIGFyZSAxNzggemlwIGNvZGVzIGluIE5ZQy4NCg0KVG8gYmVnaW4sIHdlIHdpbGwgcmV2aWV3IFNWSSBkYXRhIGJ5IE5ZIGNvdW50eS4NCg0KIyMjIyMgKipSZXZpZXcgb2YgU1ZJIERhdGEgYnkgTllDIENvdW50eSoqDQoNCmBgYHtyLCBjYWNoZT1UUlVFLCBlY2hvPUZBTFNFfQ0KI2RzX21lcmdlZEBkYXRhJT4lc2VsZWN0KGMoNSwxMSwxMzoxNykpJT4lZ3JvdXBfYnkoQ09VTlRZKQ0KbnljX2NmaXBzPC1jKCIzNjAwNSIsICIzNjA0NyIsIjM2MDYxIiwgIjM2MDg1IiwgIjM2MDgxIiApDQpkc19zdmlfY291bnR5PC1jb3VudHlfc3ZpJT4lZmlsdGVyKEZJUFMgJWluJSBueWNfY2ZpcHMpDQprbml0cjo6a2FibGUoZHNfc3ZpX2NvdW50eVtjKDQ6NiwgNzksODUsIDg5LCA5NiwgOTgpXSwgZm9ybWF0PSJtYXJrZG93biIpDQpgYGANCg0KQXQgYSBnbGFuY2UsIHRoZSBCcm9ueCBjb3VudHkgaGFzIHRoZSBoaWdoZXN0IG92ZXJhbGwgc29jaWFsIHZ1bG5lcmFiaWxpdHkgKFJQTF9USEVNRVM9MS4wMDApIGZvbGxvd2VkIGJ5IEtpbmdzIGNvdW50eSAoUlBMX1RIRU1FUz0wLjkxOCkuIFRoaXMgc2VlbXMgdG8gaW5kaWNhdGUgdGhhdCB0aGVzZSB0d28gY291bnRpZXMgYXJlIGxpa2VseSB0byBiZSBzdWJzdGFudGlhbGx5IGltcGFjdGVkIGJ5IENPVklEMTkgYW5kIG5lZWQgcHJpb3JpdHkgYWxsb2NhdGlvbiBvZiBlbWVyZ2VuY3kgcmVzb3VyY2VzLiANCg0KIyMjIyMgKipNYXBwaW5nIFNWSSBkYXRhIGJ5IENvdW50eSoqDQpgYGB7ciwgZWNobz1GQUxTRSwgY2FjaGU9VFJVRX0NCmNvdW50eV9zcDwtY291bnRpZXMoc3RhdGU9Ik5ZIikNCmNvdW50eV9zcDwtY291bnR5X3NwW2NvdW50eV9zcEBkYXRhJEdFT0lEICVpbiUgYygiMzYwMDUiLCAiMzYwNDciLCIzNjA2MSIsICIzNjA4NSIsICIzNjA4MSIgKSxdDQpjb3VudHlfbWVyZ2VkPC1nZW9fam9pbihjb3VudHlfc3AsIGRzX3N2aV9jb3VudHksICJHRU9JRCIsICJGSVBTIikNCiNwb3AgdXANCnBvcHVwIDwtIHBhc3RlMCgiQ291bnR5OiAiLCBjb3VudHlfbWVyZ2VkJENPVU5UWSwgIjxicj4iLCAiU1ZJOiAiLCBjb3VudHlfbWVyZ2VkJFJQTF9USEVNRVMpDQojY29sb3IgcmFuZ2VzDQpwYWwgPC0gY29sb3JOdW1lcmljKA0KICBwYWxldHRlID0gIkJ1R24iLA0KICBkb21haW4gPSBjb3VudHlfbWVyZ2VkJFJQTF9USEVNRVMpDQojI2xlYWZsZXQgcGxvdCBvZiBOWUMgU1ZJIGRhdGEgYnkgQ09VTlRZDQpsZWFmbGV0KCkgJT4lDQogIGFkZFByb3ZpZGVyVGlsZXMoIkNhcnRvREIuUG9zaXRyb24iKSAlPiUNCiAgYWRkUG9seWdvbnMoZGF0YSA9IGNvdW50eV9tZXJnZWQsIA0KICAgICAgICAgICAgICBmaWxsQ29sb3IgPSB+cGFsKGNvdW50eV9tZXJnZWQkUlBMX1RIRU1FUyksIA0KICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsICMgeW91IG5lZWQgdG8gdXNlIGhleCBjb2xvcnMNCiAgICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAwLjcsIA0KICAgICAgICAgICAgICB3ZWlnaHQgPSAxLCANCiAgICAgICAgICAgICAgc21vb3RoRmFjdG9yID0gMC4yLA0KICAgICAgICAgICAgICBwb3B1cCA9IHBvcHVwKSAlPiUNCiAgYWRkTGVnZW5kKHBhbCA9IHBhbCwgDQogICAgICAgICAgICB2YWx1ZXMgPSBjb3VudHlfbWVyZ2VkJFJQTF9USEVNRVMsIA0KICAgICAgICAgICAgcG9zaXRpb24gPSAiYm90dG9tcmlnaHQiLCANCiAgICAgICAgICAgIHRpdGxlID0gIlNvY2lhbCBWdWxuZXJhYmlsaXR5IEluZGV4IikNCiAgICAgICAgICAgICNsYWJGb3JtYXQgPSBsYWJlbEZvcm1hdChzdWZmaXggPSAiJSIpKSANCmBgYA0KDQpOb3csIGxldCdzIHRha2UgYSBsb29rIGF0IGhvdyBDT1ZJRDE5IGhhcyBpbXBhY3RlZCBOWUMgY291bnRpZXMgdG8gZGF0ZToNCg0KYGBge3IsIGVjaG89RkFMU0UsIGNhY2hlPVRSVUV9DQpjYzwtcmVhZF9jc3YoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9ueWNoZWFsdGgvY29yb25hdmlydXMtZGF0YS9tYXN0ZXIvYm9yby5jc3YiKQ0KY2M8LWNjJT4lbXV0YXRlKENPVU5UWT1pZmVsc2UoQk9ST1VHSF9HUk9VUD09J1RoZSBCcm9ueCcsJ0Jyb254JywgaWZlbHNlKEJPUk9VR0hfR1JPVVA9PSdCcm9va2x5bicsJ0tpbmdzJywgaWZlbHNlKEJPUk9VR0hfR1JPVVA9PSdNYW5oYXR0YW4nLCdOZXcgWW9yaycsIGlmZWxzZShCT1JPVUdIX0dST1VQPT0nUXVlZW5zJywgJ1F1ZWVucycsIGlmZWxzZShCT1JPVUdIX0dST1VQPT0nU3RhdGVuIElzbGFuZCcsJ1JpY2htb25kJywgJ05BJykpKSkpKSANCmtuaXRyOjprYWJsZShjYywgZm9ybWF0PSJtYXJrZG93biIpDQpgYGANCg0KVGhlIGFib3ZlIGNvbnRhaW5zIGN1bXVsYXRpdmUsIGFnZSBhZGp1c3RlZCByYXRlcyBvZiBjb25maXJtZWQgY2FzZXMgcGVyIDEwMCwwMDAgcGVvcGxlLCBieSBOWUMgYm9yb3VnaCBvZiByZXNpZGVuY2UuIFdlIGNhbiBzZWUgdGhhdCBUaGUgQnJvbnggKEJyb254IENvdW50eSkgYW5kIFN0YXRlbiBJc2xhbmQgKFJpY2htb25kIENvdW50eSkgaGF2ZSBoaWdoZXIgQ09WSUQgY2FzZSByYXRlcyBpbiByZWxhdGlvbiB0byBhbGwgb3RoZXIgY291bnRpZXMuIEFzc3VtaW5nIENPVklEIGNhc2UgcmF0ZSBpcyBhbiBpbmRpY2F0b3Igb2YgQ09WSUQgaW1wYWN0LCBsZXQncyBhZGQgaW4gQ09WSUQgZGF0YSBpbnRvIHRoZSBjdXJyZW50IFNWSSByYW5raW5ncy4gDQoNCk5vdGU6IEkgZG9uJ3QgdGhpbmsgaXQncyB0aGlzIGVhc3kuDQoNCiMjIyMjICoqQWRkaW5nIENPVklEIERBVEEgaW50byBQZXJjZW50IFJhbmtpbmcgaW4gU1ZJKioNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI2tlZXAgUlBMIGFuZCBTUEwgY29sdW1ucw0KZHNfc3ZpX2NvdW50eTwtZHNfc3ZpX2NvdW50eVtjKDQ6NiwgNzksODUsIDg5LCA5Njo5OCldICANCiNqb2luIHN2aSBhbmQgY292aWQgZGF0YSBieSBjb3VudHkNCnN2aV9jYzwtbGVmdF9qb2luKGRzX3N2aV9jb3VudHksIGNjLCBieT0iQ09VTlRZIikNCg0KI3BlcmNlbnQgcmFuayBjb3ZpZCBjYXNlIHJhdGUNCnN2aV9jYzwtc3ZpX2NjJT4lbXV0YXRlKGNvdmlkX3Jhbms9cGVyY2VudF9yYW5rKENPVklEX0NBU0VfUkFURSkpDQojYWRkIHBlcmNlbnQgcmFua2VkIGNvdmlkIGNhc2UgcmF0ZSB0byBTUEwgVGhlbWVzDQpzdmlfY2MkYWRqX1NQTDwtc3ZpX2NjJFNQTF9USEVNRVMgKyBzdmlfY2MkY292aWRfcmFuaw0KI3BlcmNlbnQgcmFuayBhZGp1c3RlZCBTUEwNCnN2aV9jYzwtc3ZpX2NjJT4lbXV0YXRlKHN2aV9jb3ZpZF9yYW5rPXBlcmNlbnRfcmFuayhhZGpfU1BMKSkNCmNvbG5hbWVzKHN2aV9jYykNCg0Ka25pdHI6OmthYmxlKHN2aV9jY1tjKDEsMTAsIDgsIDEyOjE1KV0sIGZvcm1hdD0ibWFya2Rvd24iKQ0KYGBgDQoNCkJhc2VkIG9uIHRoZSBuZXcgInN2aV9jb3ZpZF9yYW5rIiwgd2UgY2FuIHNlZSB0aGF0IEJyb254IGFuZCBLaW5ncyBjb3VudHkgc3RpbGwgaG9sZCB0aGVpciByYW5rIGFzIHRoZSBoaWdoZXN0IGluIHNvY2lhbCB2dWxuZXJhYmlsaXR5IGluIHRoZSBjb250ZXh0IG9mIENPVklELiANCg0KIyMjIyMgKipNYXBwaW5nIENPVklEIGFkanVzdGVkIFNWSSBkYXRhIGJ5IENvdW50eSoqDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBjYWNoZT1UUlVFfQ0Kc3ZpX2NjPC1nZW9fam9pbihjb3VudHlfc3AsIHN2aV9jYywgIkdFT0lEIiwgIkZJUFMiKQ0KI3BvcCB1cA0KcG9wdXAgPC0gcGFzdGUwKCJDb3VudHk6ICIsIHN2aV9jYyRDT1VOVFksICI8YnI+IiwgIlNWSV9Db3ZpZDogIiwgc3ZpX2NjJHN2aV9jb3ZpZF9yYW5rKQ0KI2NvbG9yIHJhbmdlcw0KcGFsIDwtIGNvbG9yTnVtZXJpYygNCiAgcGFsZXR0ZSA9ICJCdUduIiwNCiAgZG9tYWluID0gc3ZpX2NjJHN2aV9jb3ZpZF9yYW5rKQ0KIyNsZWFmbGV0IHBsb3Qgb2YgTllDIFNWSSBkYXRhIGJ5IENPVU5UWQ0KbGVhZmxldCgpICU+JQ0KICBhZGRQcm92aWRlclRpbGVzKCJDYXJ0b0RCLlBvc2l0cm9uIikgJT4lDQogIGFkZFBvbHlnb25zKGRhdGEgPSBjb3VudHlfbWVyZ2VkLCANCiAgICAgICAgICAgICAgZmlsbENvbG9yID0gfnBhbChzdmlfY2Mkc3ZpX2NvdmlkX3JhbmspLCANCiAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCAjIHlvdSBuZWVkIHRvIHVzZSBoZXggY29sb3JzDQogICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gMC43LCANCiAgICAgICAgICAgICAgd2VpZ2h0ID0gMSwgDQogICAgICAgICAgICAgIHNtb290aEZhY3RvciA9IDAuMiwNCiAgICAgICAgICAgICAgcG9wdXAgPSBwb3B1cCkgJT4lDQogIGFkZExlZ2VuZChwYWwgPSBwYWwsIA0KICAgICAgICAgICAgdmFsdWVzID0gc3ZpX2NjJHN2aV9jb3ZpZF9yYW5rLCANCiAgICAgICAgICAgIHBvc2l0aW9uID0gImJvdHRvbXJpZ2h0IiwgDQogICAgICAgICAgICB0aXRsZSA9ICJDT1ZJRCBhZGp1c3RlZCBTb2NpYWwgVnVsbmVyYWJpbGl0eSBJbmRleCIpDQogICAgICAgICAgICAjbGFiRm9ybWF0ID0gbGFiZWxGb3JtYXQoc3VmZml4ID0gIiUiKSkgDQpgYGANCg0KDQoNCg0KIyMjIyBaSVAgQ09ERSBDTEVBTi9UUkFOU0ZPUk0gIzE3OCB6aXAgY29kZXMgaW4gbnljDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KIyNaSVAgQ09ERSBDTEVBTi9UUkFOU0ZPUk0gIzE3OCB6aXAgY29kZXMgaW4gbnljDQojbnljIHppcCAtIHNlcGFyYXRlIGNvbW1hIHNlcCB2YWx1ZXMgaW50byBpbmRpdmlkdWFsIHJvd3MNCm55Y196aXBzPC1zZXBhcmF0ZV9yb3dzKG55Y196aXBzLCBgWklQIENvZGVzYCwgY29udmVydD1GQUxTRSkNCmNvbG5hbWVzKG55Y196aXBzKVszXTwtIlpJUCINCg0KI3VzZSBaQ1RBUyBhbmQgbnljIHppcHMgdG8gY3JlYXRlIE5ZQyBaSVAgc3BhdGlhbCBsYXllcg0Kb3B0aW9ucyh0aWdyaXNfdXNlX2NhY2hlID0gVFJVRSkNCnpjdGFzX255PC16Y3RhcyhjYj1UUlVFLCBzdGFydHNfd2l0aD1jKCIxMCIsIjExIikpDQp4PC1ueWNfemlwcyRaSVANCm55Y196aXBzPC16Y3Rhc19ueVt6Y3Rhc19ueUBkYXRhJFpDVEE1Q0UxMCAlaW4lIHgsIF0NCg0KI05ZQyBaSVAgU1BBVElBTCsgQ09WSUQtMTkgRGF0YQ0KbnljX2NvdmlkPC1nZW9fam9pbihueWNfemlwcywgY292aWQsICJaQ1RBNUNFMTAiLCAiTU9EWkNUQSIpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0UsIGV2YWw9RkFMU0V9DQojI0NoaWxkIE9QUCBDTEVBTi9UUkFOU0ZPUk0NCiMjIHNlbGVjdCBjaGlsZCBvcHAgdmFyaWFibGVzDQpjb2xuYW1lcyhjaGlsZF9vcHApDQp5PC1jKDIsMyw2LDcsMTU6MTgpDQpjaGlsZF9vcHA8LWNoaWxkX29wcFt5XQ0KY29sbmFtZXMoY2hpbGRfb3BwKVsxXTwtIkdFT0lEIg0KI3NldCBmYWN0b3Igb3JkZXIgaW4gcGxvdCB2YWx1ZQ0KY2hpbGRfb3BwJGM1X0NPSV9uYXQ8LWFzLmZhY3RvcihjaGlsZF9vcHAkYzVfQ09JX25hdCkNCmNoaWxkX29wcCRjNV9DT0lfbmF0PC1vcmRlcmVkKGNoaWxkX29wcCRjNV9DT0lfbmF0LCBsZXZlbHM9YygiVmVyeSBMb3ciLCAiTG93IiwgIk1vZGVyYXRlIiwgIkhpZ2giLCAiVmVyeSBIaWdoIikpDQojZW5yaWNoIGdlbyBzcGF0aWFsIGRhdGEgdy9jaGlsZCBvcHAgZGF0YQ0KbWVyZ2Vfb3BwPC1nZW9fam9pbih0cmFjdHMsIGNoaWxkX29wcCwgIkdFT0lEIiwgIkdFT0lEIikNCiNPbmx5IE5ZQyBDb3VudHkgRklQUw0KbWVyZ2Vfb3BwPC1tZXJnZV9vcHBbbWVyZ2Vfb3BwQGRhdGEkY291bnR5ZmlwcyAlaW4lIG55Y19jZmlwcyxdDQoNCg0KI3dyaXRlIGRhdGEgaW50byBkZXJpdmVkIGZvbGRlcg0KI3dyaXRlLmNzdihjaGlsZF9vcHAsICIuLi9EZXJpdmVkRGF0YS9jaGlsZF9vcHAuY3N2IikNCiN3cml0ZS5jc3YobWVyZ2Vfb3BwLCAiLi4vRGVyaXZlZERhdGEvLmNzdiIpDQojd3JpdGUuY3N2KCIuLi9EZXJpdmVkRGF0YS9jaGlsZF9vcHAuY3N2IikNCg0KYGBgDQoNCg0KIyMjIyBMZWFmbGV0IzEgLSBTVkkgYnkgQ2Vuc3VzIFRyYWN0DQoNCmBgYHtyICwgZWNobz1GQUxTRX0NCnBvcHVwMSA8LSBwYXN0ZTAoIkdFT0lEOiAiLCBkc19tZXJnZWQkR0VPSUQsICI8YnI+IiwgIlNvY2lhbCBWdWxuZXJhYmlsaXR5IEluZGV4OiAiLCBkc19tZXJnZWQkUlBMX1RIRU1FUywiPGJyPiIsICJDT1VOVFk6ICIsIGRzX21lcmdlZCRDT1VOVFkpDQpwYWwxIDwtIGNvbG9yTnVtZXJpYygNCiAgcGFsZXR0ZSA9ICJZbEduQnUiLA0KICBkb21haW4gPSBkc19tZXJnZWQkUlBMX1RIRU1FUykNCiMjbGVhZmxldCBwbG90IG9mIE5ZQyBTVkkgZGF0YSBieSBUUkFDVA0KbGVhZmxldCgpICU+JQ0KICBhZGRQcm92aWRlclRpbGVzKCJDYXJ0b0RCLlBvc2l0cm9uIikgJT4lDQogIGFkZFBvbHlnb25zKGRhdGEgPSBkc19tZXJnZWQsIA0KICAgICAgICAgICAgICBmaWxsQ29sb3IgPSB+cGFsMShSUExfVEhFTUVTKSwgDQogICAgICAgICAgICAgIGNvbG9yID0gIiNiMmFlYWUiLCAjIHlvdSBuZWVkIHRvIHVzZSBoZXggY29sb3JzDQogICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gMC43LCANCiAgICAgICAgICAgICAgd2VpZ2h0ID0gMSwgDQogICAgICAgICAgICAgIHNtb290aEZhY3RvciA9IDAuMiwNCiAgICAgICAgICAgICAgcG9wdXAgPSBwb3B1cDEpICU+JQ0KICBhZGRMZWdlbmQocGFsID0gcGFsMSwgDQogICAgICAgICAgICB2YWx1ZXMgPSBkc19tZXJnZWQkUlBMX1RIRU1FUywgDQogICAgICAgICAgICBwb3NpdGlvbiA9ICJib3R0b21yaWdodCIsIA0KICAgICAgICAgICAgdGl0bGUgPSAiU29jaWFsIFZ1bG5lcmFiaWxpdHkgSW5kZXgiKQ0KICAgICAgICAgICAgI2xhYkZvcm1hdCA9IGxhYmVsRm9ybWF0KHN1ZmZpeCA9ICIlIikpIA0KYGBgDQoNCiMjIyMgTGVhZmxldCMyIC0gTllDIFpJUFMNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KDQojbGVhZmxldCBwbG90IG9mIE5ZQyBaSVAgTEFZRVINCmxlYWZsZXQoKSAlPiUNCiAgYWRkUHJvdmlkZXJUaWxlcygiQ2FydG9EQi5Qb3NpdHJvbiIpICU+JQ0KICBhZGRQb2x5Z29ucyhkYXRhID0gbnljX3ppcHMsDQogICAgICAgICAgICAgIHdlaWdodCA9MSwNCiAgICAgICAgICAgICAgY29sb3I9ICJibGFjayIsDQogICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gMC4xKQ0KYGBgDQojIyMjIExlYWZsZXQjMyAtIE5ZQyBaSVBTICsgQ09WSUQxOSAlIFBvc2l0aXZlDQpgYGB7ciwgZWNobz1GQUxTRX0NCiMjTEVBRkxFVCBQTE9UVElORw0KI2hvdmVyIHRvb2xzIA0KcG9wdXAzIDwtIHBhc3RlMCgiWmlwIENvZGU6ICIsIG55Y19jb3ZpZCRaQ1RBNUNFMTAsICI8YnI+IiwgIlBlcmNlbnQgUG9zaXRpdmUgQ2FzZXM6ICIsIG55Y19jb3ZpZCR6Y3RhX2N1bS5wZXJjX3BvcykNCg0KI2NvbG9yIHJhbmdlcw0KcGFsMyA8LSBjb2xvck51bWVyaWMoDQogIHBhbGV0dGUgPSAiWWxHbkJ1IiwNCiAgZG9tYWluPSBueWNfY292aWQkemN0YV9jdW0ucGVyY19wb3MpDQoNCmxlYWZsZXQoKSAlPiUNCiAgYWRkUHJvdmlkZXJUaWxlcygiQ2FydG9EQi5Qb3NpdHJvbiIpICU+JQ0KICBhZGRQb2x5Z29ucyhkYXRhID0gbnljX2NvdmlkLA0KICAgICAgICAgICAgICBmaWxsQ29sb3IgPSB+cGFsMyh6Y3RhX2N1bS5wZXJjX3BvcyksDQogICAgICAgICAgICAgIHdlaWdodCA9MiwNCiAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDAuNywNCiAgICAgICAgICAgICAgcG9wdXAgPSBwb3B1cDMpJT4lDQogICAgYWRkTGVnZW5kKHBhbCA9IHBhbDMsIA0KICAgICAgICAgICAgdmFsdWVzID0gbnljX2NvdmlkJHpjdGFfY3VtLnBlcmNfcG9zLCANCiAgICAgICAgICAgIHBvc2l0aW9uID0gImJvdHRvbXJpZ2h0IiwgDQogICAgICAgICAgICB0aXRsZSA9ICJQZXJjZW50IFBvc2l0aXZlIiwNCiAgICAgICAgICAgIGxhYkZvcm1hdCA9IGxhYmVsRm9ybWF0KHN1ZmZpeCA9ICIlIikpIA0KYGBgDQojIyMjIExlYWZsZXQjNCAtIE5ZQyBDSElMRCBPUFANCmBgYHtyICwgZWNobz1GQUxTRX0NCiMjTEVBRkxFVCBQTE9UVElORw0KI2hvdmVyIHRvb2xzIA0KcG9wdXAyIDwtIHBhc3RlMCgiR0VPSUQ6ICIsIG1lcmdlX29wcCRHRU9JRCwgIjxicj4iLCAiQ2hpbGQgT3Bwb3J0dW5pdHkgTGV2ZWw6ICIsIG1lcmdlX29wcCRjNV9DT0lfbmF0LCI8YnI+IiwgIkNPVU5UWTogIiwgbWVyZ2Vfb3BwJG1zYW5hbWUxNSkNCiNjb2xvciByYW5nZXMNCnBhbDIgPC0gY29sb3JGYWN0b3IoDQogIHBhbGV0dGUgPSAiWWxHbkJ1IiwNCiAgZG9tYWluID0gbWVyZ2Vfb3BwJGM1X0NPSV9uYXQsDQogIHJldmVyc2UgPSBUUlVFKQ0KI2xlYWZsZXQgcGxvdCBvZiBOWUMgQ0hJTEQgT1BQIGRhdGEgYnkgVFJBQ1QNCmxlYWZsZXQoKSAlPiUNCiAgYWRkUHJvdmlkZXJUaWxlcygiQ2FydG9EQi5Qb3NpdHJvbiIpICU+JQ0KICBhZGRQb2x5Z29ucyhkYXRhID0gbWVyZ2Vfb3BwLCANCiAgICAgICAgICAgICAgZmlsbENvbG9yID0gfnBhbDIoYzVfQ09JX25hdCksIA0KICAgICAgICAgICAgICBjb2xvciA9ICIjYjJhZWFlIiwgIyB5b3UgbmVlZCB0byB1c2UgaGV4IGNvbG9ycw0KICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDAuNywgDQogICAgICAgICAgICAgIHdlaWdodCA9IDEsIA0KICAgICAgICAgICAgICBzbW9vdGhGYWN0b3IgPSAwLjIsDQogICAgICAgICAgICAgIHBvcHVwID0gcG9wdXAyKSAlPiUNCiAgYWRkTGVnZW5kKHBhbCA9IHBhbDIsIA0KICAgICAgICAgICAgdmFsdWVzID0gbWVyZ2Vfb3BwJGM1X0NPSV9uYXQsIA0KICAgICAgICAgICAgcG9zaXRpb24gPSAiYm90dG9tcmlnaHQiLCANCiAgICAgICAgICAgIHRpdGxlID0gIkNoaWxkIE9wcCIpDQojbGFiRm9ybWF0ID0gbGFiZWxGb3JtYXQoc3VmZml4ID0gIiUiKSkgDQpgYGANCiMjIyMgTGVhZmxldCM1IC0gU1ZJIGJ5IENlbnN1cyBUcmFjdCArIFpDVEFTIChaSVApIE92ZXJsYXkNCmBgYHtyICwgZWNobz1GQUxTRX0NCiMjTEVBRkxFVCBQTE9UVElORw0KI2hvdmVyIHRvb2xzIA0KcG9wdXAxIDwtIHBhc3RlMCgiR0VPSUQ6ICIsIGRzX21lcmdlZCRHRU9JRCwgIjxicj4iLCAiU29jaWFsIFZ1bG5lcmFiaWxpdHkgSW5kZXg6ICIsIGRzX21lcmdlZCRSUExfVEhFTUVTLCI8YnI+IiwgIkNPVU5UWTogIiwgZHNfbWVyZ2VkJENPVU5UWSkNCg0KI2NvbG9yIHJhbmdlcw0KcGFsMSA8LSBjb2xvck51bWVyaWMoDQogIHBhbGV0dGUgPSAiWWxHbkJ1IiwNCiAgZG9tYWluID0gZHNfbWVyZ2VkJFJQTF9USEVNRVMpDQoNCiNBdHRlbXB0ZWQgY29tYmluYXRpb24NCiNsZWFmbGV0IHBsb3Qgb2YgTllDIENISUxEIE9QUCBkYXRhIGJ5IFRSQUNUDQpsZWFmbGV0KCkgJT4lDQogIGFkZFByb3ZpZGVyVGlsZXMoIkNhcnRvREIuUG9zaXRyb24iKSAlPiUNCiMgIGFkZFBvbHlnb25zKGRhdGEgPSBtZXJnZV9vcHAsIA0KIyAgICAgICAgICAgICAgZmlsbENvbG9yID0gfnBhbDIoYzVfQ09JX25hdCksIA0KIyAgICAgICAgICAgICAgY29sb3IgPSAiI2IyYWVhZSIsICMgeW91IG5lZWQgdG8gdXNlIGhleCBjb2xvcnMNCiMgICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gMC45LCANCiMgICAgICAgICAgICAgIHdlaWdodCA9IDEsIA0KIyAgICAgICAgICAgICAgc21vb3RoRmFjdG9yID0gMC4yLA0KIyAgICAgICAgICAgICAgcG9wdXAgPSBwb3B1cDIpICU+JQ0KICBhZGRQb2x5Z29ucyhkYXRhID0gZHNfbWVyZ2VkLCANCiAgICAgICAgICAgICAgZmlsbENvbG9yID0gfnBhbDEoUlBMX1RIRU1FUyksIA0KICAgICAgICAgICAgICBjb2xvciA9ICIjYjJhZWFlIiwgIyB5b3UgbmVlZCB0byB1c2UgaGV4IGNvbG9ycw0KICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDAuOSwgDQogICAgICAgICAgICAgIHdlaWdodCA9IDEsIA0KICAgICAgICAgICAgICBzbW9vdGhGYWN0b3IgPSAwLjIsDQogICAgICAgICAgICAgIHBvcHVwID0gcG9wdXAxKSAlPiUNCiAgYWRkUG9seWdvbnMoZGF0YSA9IG55Y196aXBzLA0KICAgICAgICAgICAgICB3ZWlnaHQgPTEsDQogICAgICAgICAgICAgIGNvbG9yPSAiYmxhY2siLA0KICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDAuMSklPiUNCiMgIGFkZExlZ2VuZChwYWwgPSBwYWwyLCANCiMgICAgICAgICAgICB2YWx1ZXMgPSBtZXJnZV9vcHAkYzVfQ09JX25hdCwgDQojICAgICAgICAgICAgcG9zaXRpb24gPSAiYm90dG9tcmlnaHQiLCANCiMgICAgICAgICAgICB0aXRsZSA9ICJDaGlsZCBPcHAiKSU+JQ0KICBhZGRMZWdlbmQocGFsID0gcGFsMSwgDQogICAgICAgICAgICB2YWx1ZXMgPSBkc19tZXJnZWQkUlBMX1RIRU1FUywgDQogICAgICAgICAgICBwb3NpdGlvbiA9ICJib3R0b21sZWZ0IiwgDQogICAgICAgICAgICB0aXRsZSA9ICJTVkkiKQ0KYGBgDQo=